package controller

import (
	"bluebell/logic"
	"bluebell/models" // 确保导入 models 包以使用 ResCode
	"strconv"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// ToggleCollectHandler 切换帖子收藏状态
// @Summary 切换帖子收藏状态
// @Description 根据当前收藏状态，收藏或取消收藏帖子
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id path int true "帖子ID"
// @Security ApiKeyAuth
// @Success 200 {object} ResponseData{data=bool} "返回新的收藏状态（true: 已收藏, false: 未收藏）"
// @Failure 400 {object} ResponseData "请求参数错误"
// @Failure 401 {object} ResponseData "用户未登录"
// @Failure 404 {object} ResponseData "帖子不存在"
// @Failure 500 {object} ResponseData "服务器内部错误"
// @Router /post/toggle_collect/{post_id} [post]
func ToggleCollectHandler(c *gin.Context) {
	// 1. 获取并解析帖子ID
	pidStr := c.Param("post_id")
	postID, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("ToggleCollectHandler: 无效的帖子ID参数", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		zap.L().Error("ToggleCollectHandler: 获取用户ID失败", zap.Error(err))
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 调用逻辑层切换收藏状态
	newStatus, err := logic.ToggleCollectPost(userID, postID)
	if err != nil {
		zap.L().Error("ToggleCollectHandler: 切换收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		if resCode, ok := err.(models.ResCode); ok {
			ResponseError(c, resCode)
		} else {
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回成功响应，包含新的收藏状态
	ResponseSuccess(c, newStatus)
}

// GetCollectStatusHandler 获取帖子收藏状态
// @Summary 获取帖子收藏状态
// @Description 检查当前用户是否收藏了指定帖子
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id path int true "帖子ID"
// @Security ApiKeyAuth
// @Success 200 {object} ResponseData{data=bool} "返回收藏状态（true: 已收藏, false: 未收藏）"
// @Failure 400 {object} ResponseData "请求参数错误"
// @Failure 401 {object} ResponseData "用户未登录"
// @Failure 500 {object} ResponseData "服务器内部错误"
// @Router /post/collect_status/{post_id} [get]
func GetCollectStatusHandler(c *gin.Context) {
	// 1. 获取并解析帖子ID
	pidStr := c.Param("post_id")
	postID, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("GetCollectStatusHandler: 无效的帖子ID参数", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		zap.L().Error("GetCollectStatusHandler: 获取用户ID失败", zap.Error(err))
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 调用逻辑层获取收藏状态
	isCollected, err := logic.GetCollectStatus(userID, postID)
	if err != nil {
		zap.L().Error("GetCollectStatusHandler: 获取收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}

	// 4. 返回成功响应，包含收藏状态
	ResponseSuccess(c, isCollected)
}

// CollectPostHandler 收藏帖子
// @Summary 收藏帖子
// @Description 用户收藏一篇帖子
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id path int true "帖子ID"
// @Security ApiKeyAuth
// @Success 200 {object} ResponseData "成功响应"
// @Failure 400 {object} ResponseData "请求参数错误"
// @Failure 401 {object} ResponseData "用户未登录"
// @Failure 404 {object} ResponseData "帖子不存在"
// @Failure 409 {object} ResponseData "帖子已被收藏"
// @Failure 500 {object} ResponseData "服务器内部错误"
// @Router /post/collect/{post_id} [post]
func CollectPostHandler(c *gin.Context) {
	// 1. 获取并解析帖子ID
	pidStr := c.Param("post_id")
	postID, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("CollectPostHandler: 无效的帖子ID参数", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		zap.L().Error("CollectPostHandler: 获取用户ID失败", zap.Error(err))
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 调用逻辑层处理收藏请求
	if err := logic.CollectPost(userID, postID); err != nil {
		zap.L().Error("CollectPostHandler: 收藏帖子失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))

		// 尝试将 logic 层返回的 error 断言为 models.ResCode
		if resCode, ok := err.(models.ResCode); ok {
			// 如果是业务错误码（例如 帖子不存在、已收藏），直接返回对应的错误信息
			ResponseError(c, resCode)
		} else {
			// 对于其他未知错误（例如数据库操作失败），统一返回服务器繁忙
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回成功响应
	ResponseSuccess(c, nil)
}

// UncollectPostHandler 取消收藏
// @Summary 取消收藏帖子
// @Description 用户取消收藏一篇帖子
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param post_id path int true "帖子ID"
// @Security ApiKeyAuth
// @Success 200 {object} ResponseData "成功响应"
// @Failure 400 {object} ResponseData "请求参数错误"
// @Failure 401 {object} ResponseData "用户未登录"
// @Failure 404 {object} ResponseData "帖子未被收藏"
// @Failure 500 {object} ResponseData "服务器内部错误"
// @Router /post/uncollect/{post_id} [post]
func UncollectPostHandler(c *gin.Context) {
	// 1. 获取并解析帖子ID
	pidStr := c.Param("post_id")
	postID, err := strconv.ParseInt(pidStr, 10, 64)
	if err != nil {
		zap.L().Error("UncollectPostHandler: 无效的帖子ID参数", zap.Error(err))
		ResponseError(c, models.CodeInvalidParam)
		return
	}

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		zap.L().Error("UncollectPostHandler: 获取用户ID失败", zap.Error(err))
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 调用逻辑层处理取消收藏请求
	if err := logic.UncollectPost(userID, postID); err != nil {
		zap.L().Error("UncollectPostHandler: 取消收藏帖子失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))

		// 尝试将 logic 层返回的 error 断言为 models.ResCode
		if resCode, ok := err.(models.ResCode); ok {
			// 如果是业务错误码（例如 未收藏），直接返回对应的错误信息
			ResponseError(c, resCode)
		} else {
			// 对于其他未知错误，统一返回服务器繁忙
			ResponseError(c, models.CodeServerBusy)
		}
		return
	}

	// 4. 返回成功响应
	ResponseSuccess(c, nil)
}

// GetCollectedPostListHandler 获取用户收藏列表
// @Summary 获取用户收藏列表
// @Description 获取当前用户收藏的帖子列表
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param page query int false "页码" default(1)
// @Param size query int false "每页数量" default(10)
// @Security ApiKeyAuth
// @Success 200 {object} ResponseData{data=[]models.CollectListItem} "成功响应"
// @Failure 401 {object} ResponseData "用户未登录"
// @Failure 500 {object} ResponseData "服务器内部错误"
// @Router /user/collections [get]
func GetCollectedPostListHandler(c *gin.Context) {
	// 1. 获取分页参数
	page, size := getPageInfo(c)

	// 2. 获取当前用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, models.CodeNeedLogin)
		return
	}

	// 3. 调用逻辑层获取收藏列表
	posts, err := logic.GetCollectList(userID, page, size)
	if err != nil {
		zap.L().Error("GetCollectedPostListHandler: 获取收藏列表失败",
			zap.Int64("userID", userID),
			zap.Int64("page", page),
			zap.Int64("size", size),
			zap.Error(err))
		ResponseError(c, models.CodeServerBusy)
		return
	}

	// 4. 返回响应
	ResponseSuccess(c, posts)
}
